package com.ldu.houserent.common.base;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.io.Serializable;        //支持序列化
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;

/*
    所有service接口的基础接口
 */
public interface BaseService<E,ID extends Serializable> {
    //对应mapper对象
    BaseMapper<E> getRepository();

    /*
        根据主键id获取对象
     */
    default E get(ID id){
        return getRepository().selectById(id);
    }

    /*
        获取所有列表
     */
    default List<E> getAll(){
        return getRepository().selectList(null);
    }

    /*
        添加一条记录
     */
    default E insert(E entity){
        getRepository().insert(entity);
        return entity;      //其实是返回entity的主键
    }

    /*
        修改一条记录
     */
    default E update(E entity){
        getRepository().updateById(entity);
        return entity;
    }

    /*
        添加或更新一条记录
     */
    default E insertOrUpdate(E entity){
        //获取到当前对象的id，如果该id存在，则是修改；如果该id不存在，则是添加
        try {       //try/catch捕获异常
            Object id=entity.getClass().getMethod("getId").invoke(entity);      //通过invoke反射的方式，getMethod是获取方法，获取到getId的方法
            if (id==null){      //没有id，说明需要新增
                insert(entity);     //调用insert方法进行新增
            }
            else{               //有id，说明需要更新
                update(entity);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return entity;
    }

    /*
        根据主键id删除一条记录
     */
    default int delete(ID id){
        return getRepository().deleteById(id);
    }

    /*
        根据id批量删除记录
     */
    default void batchDelete(List<ID> ids){
        getRepository().deleteBatchIds(ids);
    }

    /*
        分页查询
     */
    default Page<E> findAll(Page<E> page){
        return (Page<E>) getRepository().selectPage(page,null);         //强制类型转化
    }

    /*
        获得查询器
     */
    QueryWrapper<E> getQueryWrapper(E e);       //QueryWrapper ： Entity 对象封装操作类

    /*
       获得带参数的查询器
    */
    QueryWrapper<E> getQueryWrapper(Map<String,Object> condition);

    /*
        根据查询条件分页查询
     */
    default Page<E> findAll(Page<E> page,E e){
        QueryWrapper<E> queryWrapper = getQueryWrapper(e);
        return (Page<E>) getRepository().selectPage(page,queryWrapper);
    }

    /*
        根据查询条件分页查询  mapper参数
     */
    default Page<E> findAll(Page<E> page,Map<String,Object> condition){
        QueryWrapper<E> queryWrapper = getQueryWrapper(condition);
        return (Page<E>) getRepository().selectPage(page,queryWrapper);
    }

}
